﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Threading;
using Xceed.Wpf.Toolkit;


namespace WPF_Civilisation
{
    /// <summary>
    /// Logique d'interaction pour Window_Configuration.xaml
    /// </summary>
    public partial class Window_Configuration : Window
    {
        /// <summary>
        /// Constructeur de la fenêtre
        /// </summary>
        public Window_Configuration()
        {
            InitializeComponent();

            couleurs_disponibles();
        }

        /// <summary>
        /// Mise à jour des couleurs disponibles pour les joueurs
        /// </summary>
        private void couleurs_disponibles()
        {
            ObservableCollection<ColorItem> o = new ObservableCollection<ColorItem>();
            o.Add(new ColorItem(Colors.Blue, "Bleu"));
            o.Add(new ColorItem(Colors.Red, "Rouge"));
            o.Add(new ColorItem(Colors.Orange, "Orange"));
            o.Add(new ColorItem(Colors.Yellow, "Jaune"));
            o.Add(new ColorItem(Colors.Purple, "Violet"));
            o.Add(new ColorItem(Colors.Green, "Vert"));
            color_joueur1.AvailableColors = o;
            color_joueur2.AvailableColors = o;
            color_joueur3.AvailableColors = o;
            color_joueur4.AvailableColors = o;
        }

        /// <summary>
        /// Méthode appelée lorsque l'utilisateur clique sur "Commencer la partie!"
        /// </summary>
        /// <param name="sender">Bouton appuyé</param>
        /// <param name="e">Evènement</param>
        private void push_button_start(object sender, RoutedEventArgs e)
        {
            Hashtable joueurs = new Hashtable();
            List<Color> colors = new List<Color>();

            //Si les informations des joueurs sont correctes...
            if (test_validite_joueurs(joueurs, colors))
            {
                //Création et affichage de la fenêtre de partie
                BackgroundWorker worker = new BackgroundWorker();
                Window_Carte w = null;
                worker.DoWork += (o, ea) =>
                {
                    Dispatcher.Invoke((Action)(() => w = new Window_Carte(joueurs, (bool)taille_carte_grande.IsChecked,this)));

                };
                worker.RunWorkerCompleted += (o, ea) =>
                {
                    w.Show();
                    this.Close();
                };
                grid.IsEnabled = false;
                progressBar.Visibility = Visibility.Visible;
                progressBar.Minimum = 0;
                progressBar.Maximum = 100;
                progressBar.Value = 0;
                status.Content = "Partie en cours de création...";
                
                worker.RunWorkerAsync();
                
            }
        }

        /// <summary>
        /// Méthode permettant de s'assurer les informations des joueurs (pas les mêmes pseudos, couleurs, au moins deux joueurs ...)
        /// </summary>
        /// <param name="joueurs">Hashtable contenant les nom des joueurs et leurs civilisations</param>
        /// <param name="colors">Liste des couleurs des joueurs</param>
        /// <returns>Vrai - si les informations sont bonnes
        ///          Faux - sinon</returns>
        private bool test_validite_joueurs(Hashtable joueurs, List<Color> colors)
        {
            if (pseudo_joueur1.IsEnabled && pseudo_joueur1.Text != "")
            {
                String nom = pseudo_joueur1.Text;
                String civ = "INFO";
                if ((bool)eii_1.IsChecked)
                    civ = "EII";
                if (joueurs.ContainsKey(nom))
                {
                    //On affiche un message à l'écran
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir le même pseudo.");
                    return false;
                }
                else if (colors.Contains(color_joueur1.SelectedColor))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir la même couleur.");
                    return false;
                }
                colors.Add(color_joueur1.SelectedColor);
                joueurs.Add(nom, new Tuple<string, Color>(civ, color_joueur1.SelectedColor));
            }
            if (pseudo_joueur2.IsEnabled && pseudo_joueur2.Text != "")
            {
                String nom = pseudo_joueur2.Text;
                String civ = "INFO";
                if ((bool)eii_2.IsChecked)
                    civ = "EII";
                if (joueurs.ContainsKey(nom))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir le même pseudo.");
                    return false;
                }
                else if (colors.Contains(color_joueur2.SelectedColor))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir la même couleur.");
                    return false;
                }
                colors.Add(color_joueur2.SelectedColor);
                joueurs.Add(nom, new Tuple<string, Color>(civ, color_joueur2.SelectedColor));
            }

            if (pseudo_joueur3.IsEnabled && pseudo_joueur3.Text != "")
            {
                String nom = pseudo_joueur3.Text;
                String civ = "INFO";
                if ((bool)eii_3.IsChecked)
                    civ = "EII";
                if (joueurs.ContainsKey(nom))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir le même pseudo.");
                    return false;
                }
                else if (colors.Contains(color_joueur3.SelectedColor))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir la même couleur.");
                    return false;
                }
                colors.Add(color_joueur3.SelectedColor);
                joueurs.Add(nom, new Tuple<string, Color>(civ, color_joueur3.SelectedColor));
            }
            if (pseudo_joueur4.IsEnabled && pseudo_joueur4.Text != "")
            {
                String nom = pseudo_joueur4.Text;
                String civ = "INFO";
                if ((bool)eii_4.IsChecked)
                    civ = "EII";
                if (joueurs.ContainsKey(nom))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir le même pseudo.");
                    return false;
                }
                else if (colors.Contains(color_joueur4.SelectedColor))
                {
                    afficherBoiteErreur("Deux joueurs ne peuvent pas avoir la même couleur.");
                    return false;
                }
                joueurs.Add(nom, new Tuple<string, Color>(civ, color_joueur4.SelectedColor));
            }

            return true;
        }

        /// <summary>
        /// Méthode permettant à l'utilisateur d'ajouter des joueurs
        /// Exemple si un deuxième joueur a été ajouté alors on rend possible la déclaration d'un troisième joueur
        /// </summary>
        /// <param name="sender">Textbox dont le texte a été modifié</param>
        /// <param name="e">Evènement</param>
        private void rafraichirNomJoueur(object sender, TextChangedEventArgs e)
        {
            //Si pas null, le formulaire a été créé
            if (pseudo_joueur4 != null)
            {
                pseudo_joueur1.IsEnabled = true;
                if (!pseudo_joueur1.Text.Equals(""))
                    pseudo_joueur2.IsEnabled = true;
                else
                    pseudo_joueur2.IsEnabled = false;

                if (!pseudo_joueur2.Text.Equals(""))
                {
                    pseudo_joueur3.IsEnabled = true;
                    status.Content = "La partie peut commencer...";
                    button_start.IsEnabled = true;
                }
                else
                {
                    pseudo_joueur3.IsEnabled = false;
                    status.Content = "Deux joueurs sont nécessaires pour démarrer une partie...";
                    button_start.IsEnabled = false;
                }

                if (!pseudo_joueur3.Text.Equals(""))
                    pseudo_joueur4.IsEnabled = true;
                else
                    pseudo_joueur4.IsEnabled = false;
            }
        }

        public void updateProgressBar(double value)
        {
            progressBar.Value = value;
            progressBar.Dispatcher.Invoke(DispatcherPriority.Render, (Action)delegate() { });
        }

        private void afficherBoiteErreur(string msg){
            string messageBoxText = msg;
            string caption = "Erreur de configuration";
            MessageBoxButton button = MessageBoxButton.OK;
            MessageBoxImage icon = MessageBoxImage.Error;
            System.Windows.MessageBox.Show(messageBoxText, caption, button, icon);
        }
    }
}
